#include "../header/JoueurHumain.h"
#include <iostream>
#include "stdlib.h"

int JoueurHumain::jouer() {

	string couleur;
	string choix;
	string pionChoisi;
	Pion *pion;
	int caseLigneChoisi = 0;
	int caseColonneChoisi = 0;
	bool mauvaiseSaisie1 = true;
	bool mauvaiseSaisie2 = true;
	bool mauvaiseSaisie3 = true;
	bool mauvaiseSaisie4 = true;
	bool mauvaiseSaisie5 = true;
	if (this->numero == 1) {
		couleur = "Vert";
	} else {
		couleur = "Rouge";
	}
	cout << "Tour du joueur numero " << this->numero << " ( " << couleur
			<< " ) " << endl;

	while (mauvaiseSaisie1) {
		/* Affichage de la main du Joueur  */
		this->map->affichePlateau();
		this->afficheMain();

		cout << "Que voulez vous faire " << this->nom << " ? " << endl;
		cout << "Jouer (1) | Sauvegarder la partie (2) |  Quitter (3) " << endl;
		cin >> choix;
		/* Jouer */
		if (choix.compare("1") == 0) {
			/* Choix du pion */
			mauvaiseSaisie1 = false;
			while (mauvaiseSaisie2) {

				choix = "";
				cout << "Quel pion voulez-vous jouer?" << endl;
				cout
						<< "(Gazelle) , (Croco), (Lion), (Elephant) ou le (Zebre) ? "
						<< endl;
				cin >> choix;
				if (choix.compare("Gazelle") != 0 && choix.compare("Croco") != 0
						&& choix.compare("Lion") != 0
						&& choix.compare("Elephant") != 0
						&& choix.compare("Zebre") != 0) {
					cout << "Saisie incorrecte" << endl;
				} else {
					int nb = 0;
					/* Verifie si il reste pion de meme nom */
					for (int i = 0; i < this->nbPion; i++) {
						if (this->main[i]->getName().compare(choix) == 0) {
							nb++;
						}
					}
					if (nb != 0) {
						this->map->affichePlateau();
						/* Choix de la case */
						pionChoisi = choix;
						mauvaiseSaisie2 = false;
						while (mauvaiseSaisie3) {
							choix = "";
							cout << "Sur quel case voulez vous jouer votre "
									<< pionChoisi << " ? " << endl;
							/* Position d'impala johns */
							/* Si impala est en haut ou en bas */
							if (this->map->getImpala()->getPosX() == 0
									|| this->map->getImpala()->getPosX() == 6) {
								cout << "Impala observe la colonne "
										<< this->map->getImpala()->getPosY()
										<< endl;
								cout << "Veuillez rentrer une ligne (1 a 5)"
										<< endl;
								cin >> choix;
								/* Verification de l'entree */
								if (atoi(choix.c_str()) < 6
										&& atoi(choix.c_str()) > 0) {
									/* Verification si la case est disponible */
									if (this->map->getPlateau(
											atoi(choix.c_str()),
											this->map->getImpala()->getPosY())->isCaseVide()) {
										mauvaiseSaisie3 = false;
										caseLigneChoisi = atoi(choix.c_str());
										caseColonneChoisi =
												this->map->getImpala()->getPosY();

										/* Ajout du pion dans la map */
										for (int i = 0; i < this->nbPion; i++) {
											if (pionChoisi.compare(
													this->main[i]->getName())
													== 0) {
												pion = main[i];
												break;
											}
										}

										this->map->ajoutPion(pion,
												caseLigneChoisi,
												caseColonneChoisi);
										this->map->affichePlateau();

									} else {
										this->map->affichePlateau();
										cout << "La case est deja rempli"
												<< endl;
									}
								} else {
									this->map->affichePlateau();
									cout << "Saisie incorrecte" << endl;

								}
								/* Si impala est a gauche ou a droite */
							} else {
								cout << "Impala observe la ligne "
										<< this->map->getImpala()->getPosX()
										<< endl;
								cout << "Veuillez rentrer une colonne (1 a 6)"
										<< endl;
								cin >> choix;
								/* Verification de l'entree */
								if (atoi(choix.c_str()) > 0
										&& atoi(choix.c_str()) < 7) {
									/* Verification si la case est disponible */
									if (this->map->getPlateau(
											this->map->getImpala()->getPosX(),
											atoi(choix.c_str()))->isCaseVide()) {

										mauvaiseSaisie3 = false;
										caseLigneChoisi =
												this->map->getImpala()->getPosX();
										caseColonneChoisi = atoi(choix.c_str());

										/* Ajout du pion dans la map */
										for (int i = 0; i < this->nbPion; i++) {
											if (pionChoisi.compare(
													this->main[i]->getName())
													== 0) {
												pion = main[i];
												break;
											}
										}

									} else {
										this->map->affichePlateau();
										cout << "La case est deja rempli"
												<< endl;
									}
								} else {
									this->map->affichePlateau();
									cout << "Saisie incorrecte" << endl;
								}

							}

						}

						//Ajout du pion dans la map
						for (int i = 0; i < this->nbPion; i++) {
							if (pionChoisi.compare(this->main[i]->getName())
									== 0) {
								pion = main[i];
								break;
							}
						}

						this->map->ajoutPion(pion, caseLigneChoisi,
								caseColonneChoisi);

						//Suppression du pion
						supprimerPionMain(pionChoisi);

						this->map->affichePlateau();
						if (pionChoisi.compare("Zebre") == 0) {
							this->map->checkZebre(caseLigneChoisi,
									caseColonneChoisi);
						}
						if (pionChoisi.compare("Lion") == 0) {

							this->map->checkLion(caseLigneChoisi,
									caseColonneChoisi);

						}
						if (pionChoisi.compare("Croco") == 0) {
							this->map->checkcroco(caseLigneChoisi,
									caseColonneChoisi);
						}
						if (pionChoisi.compare("Gazelle") == 0) {
							this->map->checkGazelle(caseLigneChoisi,
									caseColonneChoisi,false);
						}

						/* Faire bouger Impala*/
						while (mauvaiseSaisie4) {
							choix = "";
							this->map->affichePlateau();
							cout
									<< "De combien de cases voulez deplacer Impala? (Sens horaire) "
									<< endl;
							cout << "(1) , (2) ou (3) " << endl;
							cin >> choix;
							if (choix.compare("1") == 0
									|| choix.compare("2") == 0
									|| choix.compare("3") == 0) {
								mauvaiseSaisie4 = false;
								/*Deplacement*/
								this->map->getImpala()->deplacementImpala(
										atoi(choix.c_str()));
								bool ligneOk = false;
								cout << "Case vide restante :" << this->map->nbCaseRestant() << endl;
								if (this->map->nbCaseRestant() != 0) {
									while (!ligneOk) {
										if (this->map->getImpala()->getPosX()
												== 0
												|| this->map->getImpala()->getPosX()
														== 6) {
											for (int i = 1; i < 6; i++) {
												if (this->map->getPlateau(i,
														this->map->getImpala()->getPosY())->isCaseVide()) {
													ligneOk = true;
												}
											}
											if (!ligneOk) {
												this->map->getImpala()->deplacementImpala(
														1);
											}
										} else if (this->map->getImpala()->getPosY()
												== 0
												|| this->map->getImpala()->getPosY()
														== 7) {
											for (int i = 1; i < 7; i++) {
												if (this->map->getPlateau(
														this->map->getImpala()->getPosX(),
														i)->isCaseVide()) {
													ligneOk = true;
												}
											}
											if (!ligneOk) {
												this->map->getImpala()->deplacementImpala(
														1);
											}
										}
									}
								}
							} else {
								cout << "Saisie incorrecte" << endl;
							}
						}

					} else {
						cout << "Vous n'avez pas de " << choix << endl;
					}

				}

			}
		}
		/* Sauvegarder */
		else if (choix.compare("2") == 0) {
			while(mauvaiseSaisie5){
				choix ="";
				cout << "Voulez vous quitter? (1) oui (2) non" << endl;
				cin >> choix;
				if (choix.compare("1")==0){
					mauvaiseSaisie5=false;
					return 3;
				}
				else if (choix.compare("2")==0){
					mauvaiseSaisie5=false;
					return 2;
				}

			}

		}
		/* Quitter */
		else if (choix.compare("3") == 0) {
			return 1;
		} else {
			cout << "Saisie incorrecte" << endl;
		}
	}
	return 0;
}

